const jsonwebtoken = require("jsonwebtoken");
const { jwt } = require("../config"); // 确保与生成 Token 时使用的密钥一致

exports.checkToken = () => {
    return async (ctx, next) => {
        // 1. 定义不需要 Token 验证的白名单路径（如登录、注册接口）
        console.log("checkToken", ctx.url);

        const whiteList = ["/api/user/login", "/api/user/refreshToken", "/uploads", "/api/data/queryList"];

        // 检查请求路径是否在白名单中
        const isWhiteListed = whiteList.some((pattern) => {
            if (typeof pattern === "string") {
                return ctx.url.startsWith(pattern);
            } else if (pattern instanceof RegExp) {
                return pattern.test(ctx.url);
            }
            return false;
        });

        if (isWhiteListed) {
            return await next(); // 跳过验证
        }
        // 2. 从请求头获取 Token
        // 常见格式：Authorization: Bearer <token>
        const authHeader = ctx.headers.authorization;

        if (!authHeader || !authHeader.startsWith("Bearer ")) {
            ctx.status = 401;
            ctx.body = { code: 401, message: "未提供有效的 Token" };
            return;
        }

        const token = authHeader.split(" ")[1]; // 提取 Token 部分

        try {
            // 3. 验证 Token 有效性
            const decoded = jsonwebtoken.verify(token, jwt.secret);
            // 验证通过，将解码后的用户信息存入 ctx.state 供后续中间件使用
            ctx.state.user = decoded;
            await next(); // 继续执行下一个中间件或路由
        } catch (error) {
            // 4. 根据错误类型返回具体信息
            if (error.name === "TokenExpiredError") {
                ctx.status = 401;
                ctx.body = { code: 401, message: "Token 已过期" };
            } else if (error.name === "JsonWebTokenError") {
                ctx.status = 401;
                ctx.body = { code: 401, message: "无效的 Token" };
            } else {
                ctx.status = 500;
                ctx.body = { code: 500, message: "服务器内部错误" };
            }
        }
    };
};
